package co.edu.udea.iw.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.iw.dao.TipoDocumentoDAO;
import co.edu.udea.iw.dto.TipoDocumento;
import co.edu.udea.iw.exception.IWDaoException;

/**
 * Clase que hereda de HibernateDaoSupport e implementa (sobrescribe) los
 * metodos del dao del tipoDocumento
 * 
 * @author Santiago Ruiz
 * @author Bladimir Velez
 *
 */

public class TipoDocumentoDAOImpl extends HibernateDaoSupport implements
		TipoDocumentoDAO {

	/**
	 * Entrega los datos de un tipoDocumento dado su identificador
	 * 
	 * @param tipoD
	 *            String identificador del tipoDocumento
	 * @return instancia con los datos del tipoDocumento obtenido, si no existe
	 *         el tipoDispositivo retorna null.
	 * @throws IWDaoException
	 */
	@Override
	public TipoDocumento obtenerTipoDocumento(String tipoD)
			throws IWDaoException {
		Session session = null;
		TipoDocumento tipoDocumento;
		try {
			session = getSession();
			tipoDocumento = (TipoDocumento) session.get(TipoDocumento.class,
					tipoD);
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
		return tipoDocumento;
	}

	/**
	 * Entrega la lista de todos los tipoDocumentos existentes en base de datos
	 * 
	 * @return lista tipoDocumentos
	 * @throws IWDaoException
	 */
	@Override
	public List<TipoDocumento> obtenerTiposDocumentos() throws IWDaoException {
		Session session = null;
		List<TipoDocumento> tipoDocumentos = new ArrayList<TipoDocumento>();
		try {
			session = getSession();
			Criteria criteria = session.createCriteria(TipoDocumento.class);
			tipoDocumentos = criteria.list();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
		return tipoDocumentos;
	}

	/**
	 * Agrega un tipoDocumento
	 * 
	 * @param tipoDocumento
	 *            TipoDocumento a agregar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void agregarTipoDocumento(TipoDocumento tipoDocumento)
			throws IWDaoException {
		Session session = null;
		try {
			session = getSession();
			session.beginTransaction();
			session.save(tipoDocumento);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
	}

	/**
	 * Elimina un tipoDocumento
	 * 
	 * @param tipoDocumento
	 *            TipoDocumento a eliminar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void eliminarTipoDocumento(TipoDocumento tipoDocumento)
			throws IWDaoException {
		Session session = null;
		try {
			session = getSession();
			session.beginTransaction();
			session.delete(tipoDocumento);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}

	}

	/**
	 * Actualiza un tipoDocumento
	 * 
	 * @param tipoDocumento
	 *            TipoDocumento a actualizar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void actualizarTipoDocumento(TipoDocumento tipoDocumento)
			throws IWDaoException {
		Session session = null;
		try {
			session = getSession();
			session.beginTransaction();
			session.merge(tipoDocumento);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}

	}

}
